Purpose:

Calculate and plot mutational signatures for all samples using COSMIC signatures and Alexandrov et al, 2013 mutational signatures.

Usage

To run this from the command line, use: Rscript -e "rmarkdown::render('analyses/mutational-signatures/01-known_signatures.Rmd', clean = TRUE)"

This assumes you are in the top directory of the repository.

Setup

Packages and functions

Import necessary functions.

# Magrittr pipe
`%>%` <- dplyr::`%>%`

# Import specialized functions
source(file.path("util", "mut_sig_functions.R"))

# Load this library
library(deconstructSigs)
library(tidyverse)
── Attaching packages ────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.2.0     ✔ purrr   0.3.2
✔ tibble  2.1.3     ✔ dplyr   0.8.3
✔ tidyr   0.8.3     ✔ stringr 1.4.0
✔ readr   1.3.1     ✔ forcats 0.4.0
── Conflicts ───────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()

Set up directory paths.

data_dir <- file.path("..", "..", "data")
input_dir <- "input"
results_dir <- "results"
plots_dir <- "plots"
figures_dir <- file.path("..", "..", "figures")
cosmicv2_plots <- file.path(plots_dir, "cosmicv2")
nature_plots <- file.path(plots_dir, "nature")
cosmicv3_plots <- file.path(plots_dir, "cosmicv3")

Make new directories for the results.

if (!dir.exists(results_dir)) {
  dir.create(results_dir)
}
if (!dir.exists(cosmicv2_plots)) {
  dir.create(cosmicv2_plots, recursive = TRUE)
}
if (!dir.exists(nature_plots)) {
  dir.create(nature_plots, recursive = TRUE)
}
if (!dir.exists(cosmicv3_plots)) {
  dir.create(cosmicv3_plots, recursive = TRUE)
}

Read in data

# Declare file path for consensus file
consensus_file <- file.path(data_dir, "snv-consensus-plus-hotspots.maf.tsv.gz")

Read in the consensus MAF file.

# Read in the file
maf <- data.table::fread(consensus_file, data.table = FALSE)
Registered S3 method overwritten by 'R.oo':
  method        from       
  throw.default R.methodsS3

Read in color palettes

Read in the histology colors and labels.

histology_label_mapping <- readr::read_tsv(
  file.path(figures_dir, "palettes", "histology_label_color_table.tsv")
) %>% 
  # Select just the columns we will need for plotting
  dplyr::select(Kids_First_Biospecimen_ID, display_group, display_order, hex_codes) %>% 
  # Reorder display_group based on display_order
  dplyr::mutate(display_group = forcats::fct_reorder(display_group, display_order))
Parsed with column specification:
cols(
  Kids_First_Biospecimen_ID = col_character(),
  sample_type = col_character(),
  integrated_diagnosis = col_character(),
  Notes = col_character(),
  harmonized_diagnosis = col_character(),
  broad_histology = col_character(),
  short_histology = col_character(),
  display_group = col_character(),
  n = col_double(),
  display_order = col_double(),
  hex_codes = col_character()
)

Set up gradient color palette for the bubble matrix plots.

gradient_col_palette <- readr::read_tsv(
  file.path(figures_dir, "palettes", "gradient_color_palette.tsv")
)
Parsed with column specification:
cols(
  color_names = col_character(),
  hex_codes = col_character()
)
# Won't need NA color this time. 
gradient_col_palette <- gradient_col_palette %>%
  dplyr::filter(color_names != "na_color")

Read in the metadata and set it up with the color palette.

metadata_df <- readr::read_tsv(file.path(data_dir, "histologies.tsv"), guess_max = 10000) %>% 
  dplyr::select("Kids_First_Biospecimen_ID", "experimental_strategy") %>%
  dplyr::inner_join(histology_label_mapping, by = "Kids_First_Biospecimen_ID") %>% 
  dplyr::rename(Tumor_Sample_Barcode = "Kids_First_Biospecimen_ID") 
Parsed with column specification:
cols(
  .default = col_character(),
  OS_days = col_double(),
  age_last_update_days = col_double(),
  cns_methylation_class_score = col_double(),
  cns_methylation_subclass_score = col_double(),
  RF_purity_ABSOLUTE = col_double(),
  RF_purity_ESTIMATE = col_double(),
  RF_purity_LUMP = col_double(),
  normal_fraction = col_double(),
  tumor_fraction = col_double(),
  tumor_ploidy = col_double()
)
See spec(...) for full column specifications.

Read in tmb-all file with WGS and WXS region lengths so they can be used for the Mb denominator.

# Set up BED region file for TMB calculations
region_sizes <- readr::read_tsv(file.path(data_dir, "snv-mutation-tmb-all.tsv")) %>%
  dplyr::select(Tumor_Sample_Barcode, region_size)
Parsed with column specification:
cols(
  Tumor_Sample_Barcode = col_character(),
  experimental_strategy = col_character(),
  cancer_group = col_character(),
  mutation_count = col_double(),
  region_size = col_double(),
  tmb = col_double()
)

Set up data

Determine how many mutations we have per sample.

mut_per_sample <- maf %>%
  dplyr::group_by(Tumor_Sample_Barcode) %>%
  dplyr::tally() %>%
  dplyr::arrange(n)

summary(mut_per_sample$n)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      1      67     896    2988    1902 1079953 

Graph this.

ggplot2::ggplot(mut_per_sample, ggplot2::aes(x = n, geom = "density")) +
  ggplot2::geom_density() +
  ggplot2::theme_classic()

Make mutation data into deconstructSigs input format.

# Convert to deconstructSigs input
sigs_input <- mut.to.sigs.input(
  mut.ref = maf,
  sample.id = "Tumor_Sample_Barcode",
  chr = "Chromosome",
  pos = "Start_Position",
  ref = "Reference_Allele",
  alt = "Allele",
  bsg = BSgenome.Hsapiens.UCSC.hg38::BSgenome.Hsapiens.UCSC.hg38
)
Warning in mut.to.sigs.input(mut.ref = maf, sample.id = "Tumor_Sample_Barcode", : Some samples have fewer than 50 mutations:
  BS_X0KN4VVW, BS_7KR13R3P, BS_P7VR731D, TARGET-30-PASMJG-01A-01D, TARGET-30-PASUYL-01A-01D, TARGET-30-PASYYX-01A-01D, TARGET-30-PATYPH-01A-01D, TARGET-30-PATLXP-01A-01D, TARGET-30-PATVWA-01A-01D, TARGET-30-PATMAW-01A-01D, TARGET-30-PATVTL-01A-01D, TARGET-30-PAUBPW-09A-01D, TARGET-30-PATNRI-01A-01D, TARGET-30-PAMMXF-01A-01W, TARGET-30-PAUGJI-01A-01D, TARGET-30-PASRSG-01A-01D, TARGET-30-PATXHW-01A-01D, TARGET-30-PAPBJT-01A-01W, TARGET-30-PASVWG-01A-01D, TARGET-30-PAUCFI-01A-01D, TARGET-30-PASAFG-01A-01D, TARGET-30-PASLMN-01A-01D, TARGET-30-PARXMM-01A-01D, TARGET-30-PATBJI-01A-01D, TARGET-30-PASPVR-09A-01D, TARGET-30-PATKSX-01A-01D, TARGET-30-PAVEZM-01A-01D, TARGET-20-PANSBH-04A-01D, TARGET-30-PAUWFE-01A-01D, TARGET-30-PAPRMJ-01A-01D, TARGET-30-PARVZT-01A-01D, TARGET-30-PASUEA-01A-01D, TARGET-30-PAIXNC-01A-01W, TARGET-30-PASEWZ-01A-01D, TARGET-30-PAUWDK-01A-01D, TARGET-30-PAULVH-01A-01D, TARGET-30-PATWGR-01A-01D, TARGET-30-PASZTV-01A-01D, TARGET-30-PATSXC-01A-01D, TARGET-30-PASBZV-01A-01D, TARGET-30-PATYEJ-01A-01D, TARGET-30-PASXMI-09A-01D, TARGET-30-PATPXJ-01A-01D, TARGET-30-PATSDR-01A-01D, TARGET-30-PAUHYY-01A-01D, TARGET-30-PATXKG-01A-01D, TARGET-30-PATBAC-01A-01D, TARGET-30-PASEJZ-01A-01D, TARGET-30-PAUKLK-01A-01D, TARGET-30-PASAAB-01A-01D, TARGET-30-PAUGIP-01A-01D, TARGET-30-PALXMM-01A-01W, TARGET-30-PASVKL-09A-01D, TARGET-30-PATNEA-01A-01D, TARGET-30-PASPVZ-09A-01D, TARGET-30-PATKGB-01A-01D, TARGET-30-PAMBAC-01A-01W, TARGET-30-PASLCD-01A-01D, TARGET-30-PAUHSJ-01A-01D, TARGET-30-PAICGF-01A-01W, TARGET-30-PATFPS-09A-01D, TARGET-30-PATGLU-01A-01D, TARGET-30-PANZPV-01A-01W, TARGET-30-PAUZSB-01A-01D, TARGET-30-PATBHY-01A-01D, TARGET-30-PATSKE-01A-01D, TARGET-30-PASATF-01A-01D, TARGET-20-PASRTP-09A-01D, TARGET-30-PAIXNV-01A-01W, TARGET-30-PATVDI-01A-01D, TARGET-30-PAUMXC-01A-01D, TARGET-30-PASEGF-01A-01D, TARGET-30-PASPTF-01A-01D, TARGET-30-PAUHHW-01A-01D, TARGET-30-PATXHC-01A-01D, TARGET-30-PAUGZD-01A-01D, TARGET-30-PATLNM-01A-01D, TARGET-30-PATTPL-01A-01D, TARGET-30-PASZST-01A-01D, TARGET-30-PASTXV-01A-01D, TARGET-30-PAUNST-01A-01D, TARGET-30-PASFDU-01A-01D, TARGET-30-PAUWXY-01A-01D, TARGET-30-PATJXV-01A-01D, TARGET-30-PARUTX-01A-01D, TARGET-30-PATINJ-01A-01D, TARGET-30-PAVCLI-01A-01D, TARGET-30-PATUVB-01A-01D, TARGET-30-PAITCI-01A-01W, TARGET-30-PAVCJZ-01A-01D, TARGET-30-PAUTVX-01A-01D, TARGET-30-PAUHIK-01A-01D, TARGET-30-PAUPRN-01A-01D, TARGET-30-PATDSY-01A-01D, TARGET-30-PAUUZU-01A-01D, TARGET-30-PALBFW-01A-01W, TARGET-30-PAUFUS-01A-01D, TARGET-30-PASKYH-01A-01D, TARGET-30-PASYJF-01A-01D, TARGET-30-PATNCI-01A-01D, TARGET-30-PAMVRA-01A-01W, TARGET-30-PASRLC-01A-01D, TARGET-30-PASFKX-01A-01D, TARGET-30-PATFES-01A-01D, TARGET-30-PAMZMG-01A-01W, TARGET-30-PAKYZS-01A-01W, TARGET-30-PARSVF-01A-01D, TARGET-30-PANSBN-01A-01D, TARGET-30-PALTYB-01A-01W, TARGET-30-PASCWD-01A-01D, TARGET-30-PASMUB-01A-01D, TARGET-30-PATRXC-01A-01D, TARGET-30-PATTMM-01A-01D, TARGET-30-PATNRK-09A-01D, TARGET-30-PAUBSW-01A-01D, TARGET-30-PATYMS-01A-01D, TARGET-30-PASSEC-01A-01D, TARGET-30-PASBPN-01A-01D, TARGET-30-PASBMW-01A-01D, TARGET-30-PASEAR-01A-01D, TARGET-30-PAPHPE-01A-01W, TARGET-30-PATXWS-01A-01D, TARGET-30-PASBDN-01A-01D, TARGET-30-PATJHU-01A-01D, TARGET-30-PATAFE-01A-01D, TARGET-30-PASCZY-01A-01D, TARGET-30-PARWEH-01A-01D, TARGET-30-PASTIJ-01A-01D, TARGET-30-PASPIK-01A-01D, TARGET-30-PAVEKN-01A-01D, TARGET-30-PATNWL-01A-01D, TARGET-30-PARXVA-01A-01D, TARGET-30-PAUDIK-01A-01D, TARGET-30-PAUDMU-01A-01D, TARGET-30-PASLRM-01A-01D, TARGET-30-PAUNTY-01A-01D, TARGET-30-PASWVE-01A-01D, TARGET-30-PATRJG-01A-01D, TARGET-30-PASFCG-01A-01D, TARGET-30-PAUWYM-01A-01D, TARGET-30-PARYEH-01A-01D, TARGET-30-PAUELT-01A-01D, TARGET-30-PARJMX-01A-01D, TARGET-30-PANRHJ-01A-01W, TARGET-30-PAUIFL-01A-01D, TARGET-30-PAPUJU-01A-01D, TARGET-30-PATZBH-01A-01D, TARGET-30-PAUMMZ-01A-01D, TARGET-30-PAIXRK-01A-01W, TARGET-30-PATYWX-01A-01D, TARGET-30-PASEWX-01A-01D, TARGET-30-PAUXIW-09A-01D, TARGET-30-PAUFFP-01A-01D, TARGET-30-PAPRPR-01A-01D, TARGET-30-PAUAZA-01A-01D, TARGET-30-PATNZJ-01A-01D, TARGET-30-PAUPIC-01A-01D, TARGET-30-PALUDH-01A-01W, TARGET-30-PATYMK-01A-01D, TARGET-30-PATMTX-01A-01D, TARGET-30-PATEWM-01A-01D, TARGET-30-PASCRK-01A-01D, TARGET-30-PAULNF-01A-01D, TARGET-30-PATRHD-01A-01D, TARGET-30-PATZRU-01A-01D, TARGET-30-PAURPL-01A-01D, TARGET-30-PAUCGP-01A-01D, TARGET-30-PASKRX-01A-01D, TARGET-30-PASZFX-01A-01D, TARGET-30-PARNNG-01A-01D, TARGET-30-PAUIHH-01A-01D, TARGET-30-PASJTA-01A-01D, TARGET-30-PASWKI-01A-01D, TARGET-30-PALSAE-01A-01W, TARGET-30-PATCJP-09A-01D, TARGET-30-PAUBRR-01A-01D, TARGET-30-PAUEYW-09A-01D, TARGET-30-PAUKIJ-01A-01D, TARGET-30-PASLPG-01A-01D, TARGET-30-PASJWU-01A-01D, TARGET-30-PATSPZ-01A-01D, TARGET-30-PARYVD-01A-01D, TARGET-30-PATEKG-01A-01D, TARGET-30-PATFTR-01A-01D, TARGET-30-PAUMBB-01A-01D, TARGET-30-PAUJLH-01A-01D, TARGET-30-PATMSI-01A-01D, TARGET-30-PATYMZ-01A-01D, TARGET-30-PASLTC-01A-01D, TARGET-30-PASFWL-01A-01D, TARGET-30-PASAZZ-01A-01D, TARGET-30-PASMDG-01A-01D, TARGET-30-PASFEV-01A-01D, TARGET-30-PAUSXH-01A-01D, TARGET-30-PAUUGT-01A-01D, TARGET-30-PATCDJ-01A-01D, TARGET-30-PATHYK-01A-01D, TARGET-30-PAVDNK-01A-01D, TARGET-30-PAUJPC-01A-01D, TARGET-30-PASAHC-01A-01D, TARGET-30-PATMXC-01A-01D, TARGET-30-PAKIPY-01A-01W, TARGET-30-PARVHG-01A-01D, TARGET-30-PAVCKK-01A-01D, TARGET-30-PAURCG-01A-01D, TARGET-30-PASKSR-01A-01D, TARGET-30-PATVJX-01A-01D, TARGET-20-PANLRE-04A-01D, TARGET-30-PAKVUY-01A-01D, TARGET-30-PATFMU-01A-01D, TARGET-30-PARTCE-01A-01D, TARGET-30-PATBPG-01A-01D, TARGET-30-PASFDV-01A-01D, TARGET-30-PASBJY-01A-01D, TARGET-30-PAUGRP-01A-01D, TARGET-30-PASNUI-01A-01D, TARGET-30-PASUMG-01A-01D, TARGET-30-PASEDP-01A-01D, TARGET-30-PATMSR-01A-01D, TARGET-30-PARYWX-01A-01D, TARGET-30-PATYCM-01A-01D, TARGET-30-PATLCM-01A-01D, TARGET-30-PATMRZ-01A-01D, TARGET-30-PASLDM-01A-01D, TARGET-30-PAUBEC-01A-01D, TARGET-30-PATCKU-01A-01D, TARGET-30-PAUBVN-01A-01D, TARGET-30-PARXPD-01A-01D, TARGET-30-PARWEV-01A-01D, TARGET-30-PASNMJ-01A-01D, TARGET-30-PASKSX-01A-01D, TARGET-30-PATSRD-01A-01D, TARGET-30-PANKFE-01A-01W, TARGET-30-PATYWM-01A-01D, TARGET-30-PASGHN-01A-01D, TARGET-30-PAUZMG-01A-01D, TARGET-30-PASCEW-09A-01D, TARGET-30-PARVWL-01A-01D, TARGET-30-PARZZD-01A-01D, TARGET-30-PASLXS-01A-01D, TARGET-30-PATDVF-01A-01D, TARGET-30-PAUPGV-01A-01D, TARGET-30-PAUWEV-01A-01D, TARGET-30-PATTPW-01A-01D, TARGET-30-PAUBYW-01A-01D, TARGET-30-PASYIP-01A-01D, TARGET-30-PASJUU-01A-01D, TARGET-30-PAUBFU-01A-01D, TARGET-30-PALJUV-01A-01W, TARGET-30-PASCIX-09A-01D, TARGET-30-PASGNT-01A-01D, TARGET-30-PAPVFD-01A-01D, TARGET-30-PATTPC-01A-01D, TARGET-30-PASGEE-01A-01D, TARGET-30-PATNGD-01A-01D, TARGET-30-PAUXSZ-01A-01D, TARGET-30-PASDRV-01A-01D, TARGET-30-PASKRS-01A-01D, TARGET-30-PASGGI-01A-01D, TARGET-30-PATTFB-01A-01D, TARGET-30-PANBSP-01A-01W, TARGET-30-PASLIH-01A-01D, TARGET-30-PATPET-01A-01D, TARGET-30-PATYDC-01A-01D, TARGET-30-PATUZF-01A-01D, TARGET-30-PASSII-01A-01D, TARGET-30-PASTHF-01A-01D, TARGET-30-PASYTP-01A-01D, TARGET-30-PASUCU-01A-01D, TARGET-30-PAUGNL-01A-01D, TARGET-30-PARYSR-01A-01D, TARGET-30-PARXAX-01A-01D, TARGET-30-PASMET-01A-01D, TARGET-30-PATIHB-01A-01D, TARGET-30-PARLMK-01A-01D, TARGET-30-PATMJV-09A-01D, TARGET-30-PAUITU-01A-01D, TARGET-30-PASXCG-01A-01D, TARGET-30-PATRUX-09A-01D, TARGET-30-PARABJ-01A-01D, TARGET-30-PALXHW-01A-01W, TARGET-30-PASYYM-01A-01D, TARGET-30-PANWRR-01A-01D, TARGET-30-PARTPF-01A-01D, TARGET-30-PATUEH-01A-01D, TARGET-30-PASKRA-01A-01D, TARGET-30-PASUTC-01A-01D, TARGET-30-PATLLI-01A-01D, TARGET-30-PATMPC-01A-01D, TARGET-30-PATISU-01A-01D, TARGET-30-PATDFU-01A-01D, TARGET-30-PASJWG-01A-01D, TARGET-30-PAKHCF-01A-01W, TARGET-30-PAUTKP-01A-01D, TARGET-30-PARZZC-01A-01D, TARGET-30-PATSJV-01A-01D, TARGET-30-PASLYF-01A-01D, TARGET-30-PAPVRN-01A-01D, TARGET-30-PATWWJ-01A-01D, TARGET-30-PASMPT-01A-01D, TARGET-30-PAVCGD-01A-01D, TARGET-30-PAVALS-01A-01D, TARGET-30-PASTGH-09A-01D, TARGET-30-PATFTN-01A-01D, TARGET-30-PATPJD-09A-01D, TARGET-30-PAPTLV-01A-01D, TARGET-30-PASPXU-01A-01D, TARGET-30-PASLAE-01A-01D, TARGET-30-PASPGU-01A-01D, TARGET-30-PARYRJ-01A-01D, TARGET-30-PAUXFZ-01A-01D, TARGET-30-PAIFCS-01A-01W, TARGET-30-PASRWE-01A-01D, TARGET-30-PATDXG-01A-01D, TARGET-30-PAUKRF-01A

Add total mutations per sample.

# Count the total number of signature mutations for each sample
total_muts <- apply(sigs_input, 1, sum)

Determine Signatures for COSMIC and Alexandrov et al, 2013

Get list of tumor sample ids.

tumor_sample_ids <- maf %>%
  dplyr::filter(Tumor_Sample_Barcode %in% rownames(sigs_input)) %>%
  dplyr::distinct(Tumor_Sample_Barcode) %>%
  dplyr::pull(Tumor_Sample_Barcode)

Get COSMIC v2 signatures for each sample. This step will take some time.

sample_sigs_cosmic <- lapply(tumor_sample_ids, function(sample_id) {
  # Determine the signatures contributing to the sample
  whichSignatures(
    tumor.ref = sigs_input,
    signatures.ref = signatures.cosmic,
    sample.id = sample_id,
    contexts.needed = TRUE
  )
})
# Bring along the names
names(sample_sigs_cosmic) <- tumor_sample_ids

# Create matrix of COSMIC signature weights
cosmic_weights <- lapply(sample_sigs_cosmic, "[[", "weights")
cosmic_wide <- do.call(dplyr::bind_rows, cosmic_weights) %>%
  add_column('Kids_First_Biospecimen_ID' = unlist(lapply(cosmic_weights, rownames)), .before = 1) %>%
  tibble::as_tibble() %>%
readr::write_tsv(file.path(results_dir, 'COSMICv2_signature_exposures.tsv'))

Get Alexandrov et al, 2013 signatures for each sample.

sample_sigs_nature <- lapply(tumor_sample_ids, function(sample_id) {
  # Determine the signatures contributing to the sample
  whichSignatures(
    tumor.ref = sigs_input,
    signatures.ref = signatures.nature2013,
    sample.id = sample_id,
    contexts.needed = TRUE
  )
})
# Bring along the names
names(sample_sigs_nature) <- tumor_sample_ids

# Create data frame of Nature signature weights
nature_weights <- lapply(sample_sigs_nature, "[[", "weights")
nature_wide <- do.call(dplyr::bind_rows, nature_weights) %>%
  add_column('Kids_First_Biospecimen_ID' = unlist(lapply(nature_weights, rownames)), .before = 1) %>%
  tibble::as_tibble() %>%
readr::write_tsv(file.path(results_dir, 'Nature_signature_exposures.tsv'))

Get COSMIC genome v3.3 signatures for each sample. This step will take some time.

signatures.cosmic.v3.3 <- read_tsv(file.path(input_dir, 'COSMIC_v3.3.1_SBS_GRCh38.txt')) %>%
  column_to_rownames('Type') %>%
  t %>%
  as.data.frame()
Parsed with column specification:
cols(
  .default = col_double(),
  Type = col_character()
)
See spec(...) for full column specifications.
sample_sigs_cosmic_v33 <- lapply(tumor_sample_ids, function(sample_id) {
  # Determine the signatures contributing to the sample
  whichSignatures(
    tumor.ref = sigs_input,
    signatures.ref = signatures.cosmic.v3.3,
    sample.id = sample_id,
    contexts.needed = TRUE
  )
})
# Bring along the names
names(sample_sigs_cosmic_v33) <- tumor_sample_ids
# 
# Create matrix of COSMIC signature weights
cosmic_v33_weights <- lapply(sample_sigs_cosmic_v33, "[[", "weights")
cosmic_v33_wide <- do.call(dplyr::bind_rows, cosmic_v33_weights) %>%
  add_column('Kids_First_Biospecimen_ID' = unlist(lapply(cosmic_v33_weights, rownames)), .before = 1) %>%
  tibble::as_tibble() %>%
  readr::write_tsv(file.path(results_dir, 'COSMICv3.3_signature_exposures.tsv'))

Calculate the mutations per Mb for each signature

Do this for COSMIC v2 mutation signatures.

# Calculate mutations per signature
cosmic_sigs_df <- calc_mut_per_sig(
  sample_sigs_cosmic,
  muts_per_sample = total_muts,
  region_size = region_sizes,
  metadata = metadata_df
) 
Using Tumor_Sample_Barcode, experimental_strategy, display_group, hex_codes as id variables
# Write this to a file but drop the color column
cosmic_sigs_df %>% 
  dplyr::select(-hex_codes) %>% 
  readr::write_tsv(file.path(results_dir, "cosmicv2_signatures_results.tsv"))

# Print out a preview
cosmic_sigs_df

Do this for COSMIC v3.3 mutation signatures.

# Calculate mutations per signature
cosmicv3_sigs_df <- calc_mut_per_sig(
  sample_sigs_cosmic_v33,
  muts_per_sample = total_muts,
  region_size = region_sizes,
  metadata = metadata_df
) 
Using Tumor_Sample_Barcode, experimental_strategy, display_group, hex_codes as id variables
# Write this to a file but drop the color column
cosmicv3_sigs_df %>% 
  dplyr::select(-hex_codes) %>% 
  readr::write_tsv(file.path(results_dir, "cosmicv3.3_signatures_results.tsv"))

# Print out a preview
cosmicv3_sigs_df

Do this for Alexandrov et al, 2013 mutation signatures.

#Calculate mutations per signature
nature_sigs_df <- calc_mut_per_sig(
  sample_sigs_nature,
  muts_per_sample = total_muts,
  region_size = region_sizes,
  metadata = metadata_df
) 
Using Tumor_Sample_Barcode, experimental_strategy, display_group, hex_codes as id variables
# Write this to a file but drop the color column
nature_sigs_df %>% 
  dplyr::select(-hex_codes) %>% 
  readr::write_tsv(file.path(results_dir, "nature_signatures_results.tsv"))

# Print out a preview
nature_sigs_df

Mutation signature bubble matrix by histology groups

For COSMIC v2 signatures

bubble_matrix_plot(cosmic_sigs_df, 
                   label = "COSMIC Signatures", 
                   color_palette = gradient_col_palette$hex_codes
)
Warning: Removed 204 rows containing missing values (geom_point).

ggplot2::ggsave(
  file.path(cosmicv2_plots, "bubble_matrix_cosmicv2_mutation_sig.png"),
  width = 30, height = 20, units = "cm")
Warning: Removed 204 rows containing missing values (geom_point).

For Nature signatures

bubble_matrix_plot(nature_sigs_df, 
                   label = "Alexandrov et al, 2013 signatures", 
                   color_palette = gradient_col_palette$hex_codes)
Warning: Removed 161 rows containing missing values (geom_point).

ggplot2::ggsave(
  file.path(nature_plots, "bubble_matrix_nature_mutation_sig.png"), 
  width = 30, height = 20, units = "cm")
Warning: Removed 161 rows containing missing values (geom_point).

For COSMIC v3.3 signatures

bubble_matrix_plot(cosmicv3_sigs_df, 
                   label = "COSMIC Signatures", 
                   color_palette = gradient_col_palette$hex_codes
)
Warning: Removed 708 rows containing missing values (geom_point).

ggplot2::ggsave(
  file.path(cosmicv3_plots, "bubble_matrix_cosmicv3_mutation_sig.png"),
  width = 30, height = 20, units = "cm")
Warning: Removed 708 rows containing missing values (geom_point).

Mutation signature grouped bar plots for each histology group

We will make these plots for primary tumor samples only. Lets make these for COSMIC mutation signatures first.

# Make grouped bar plots
lapply(unique(cosmic_sigs_df$display_group),
  grouped_sig_barplot,
  sig_num_df = cosmic_sigs_df,
  output_dir = file.path(cosmicv2_plots, "signature_grouped_barplots"), 
  label = "cosmic_v2"
)
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image

Make these plots for Alexandrov et al, 2013 signatures.

# Make grouped bar plots
lapply(unique(nature_sigs_df$display_group),
  grouped_sig_barplot,
  sig_num_df = nature_sigs_df,
  output_dir = file.path(nature_plots, "signature_grouped_barplots"),
  label = "nature"
)
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image

Make these plots for COSMIC v3.3 signatures.

# Make grouped bar plots
lapply(unique(cosmicv3_sigs_df$display_group),
  grouped_sig_barplot,
  sig_num_df = cosmicv3_sigs_df,
  output_dir = file.path(cosmicv3_plots, "signature_grouped_barplots"),
  label = "cosmic_v3.3"
)
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image
Saving 7 x 5 in image

Session Info

sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)

Matrix products: default
BLAS/LAPACK: /usr/lib/libopenblasp-r0.2.19.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=C             
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] forcats_0.4.0         stringr_1.4.0         dplyr_0.8.3          
 [4] purrr_0.3.2           readr_1.3.1           tidyr_0.8.3          
 [7] tibble_2.1.3          ggplot2_3.2.0         tidyverse_1.2.1      
[10] deconstructSigs_1.9.0

loaded via a namespace (and not attached):
 [1] Biobase_2.46.0                    httr_1.4.0                       
 [3] jsonlite_1.6                      R.utils_2.9.0                    
 [5] modelr_0.1.4                      assertthat_0.2.1                 
 [7] stats4_3.6.0                      BSgenome_1.54.0                  
 [9] GenomeInfoDbData_1.2.2            cellranger_1.1.0                 
[11] Rsamtools_2.2.3                   yaml_2.2.0                       
[13] pillar_1.4.2                      backports_1.1.4                  
[15] lattice_0.20-38                   glue_1.3.1                       
[17] digest_0.6.20                     GenomicRanges_1.38.0             
[19] XVector_0.26.0                    rvest_0.3.4                      
[21] colorspace_1.4-1                  plyr_1.8.4                       
[23] htmltools_0.3.6                   Matrix_1.2-17                    
[25] R.oo_1.22.0                       XML_3.98-1.20                    
[27] pkgconfig_2.0.2                   broom_0.5.2                      
[29] haven_2.1.1                       zlibbioc_1.32.0                  
[31] scales_1.0.0                      BiocParallel_1.20.1              
[33] generics_0.0.2                    IRanges_2.20.2                   
[35] ellipsis_0.2.0.1                  withr_2.1.2                      
[37] SummarizedExperiment_1.16.1       BiocGenerics_0.32.0              
[39] lazyeval_0.2.2                    cli_1.1.0                        
[41] magrittr_1.5                      crayon_1.3.4                     
[43] readxl_1.3.1                      evaluate_0.14                    
[45] R.methodsS3_1.7.1                 nlme_3.1-140                     
[47] xml2_1.2.0                        tools_3.6.0                      
[49] data.table_1.12.2                 hms_0.4.2                        
[51] matrixStats_0.54.0                S4Vectors_0.24.4                 
[53] munsell_0.5.0                     DelayedArray_0.12.3              
[55] Biostrings_2.54.0                 compiler_3.6.0                   
[57] GenomeInfoDb_1.22.1               rlang_0.4.0                      
[59] grid_3.6.0                        RCurl_1.95-4.12                  
[61] rstudioapi_0.10                   bitops_1.0-6                     
[63] base64enc_0.1-3                   labeling_0.3                     
[65] rmarkdown_1.13                    gtable_0.3.0                     
[67] reshape2_1.4.3                    R6_2.4.0                         
[69] GenomicAlignments_1.22.1          lubridate_1.7.4                  
[71] knitr_1.23                        rtracklayer_1.46.0               
[73] stringi_1.4.3                     parallel_3.6.0                   
[75] Rcpp_1.0.1                        tidyselect_0.2.5                 
[77] xfun_0.8                          BSgenome.Hsapiens.UCSC.hg38_1.4.1
LS0tCnRpdGxlOiAiU0JTIE11dGF0aW9uYWwgU2lnbmF0dXJlcyBBbmFseXNpcyIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogIHRvYzogVFJVRQp0b2NfZmxvYXQ6IFRSVUUKYXV0aG9yOiBSeWFuIENvcmJldHQgKGFkYXB0ZWQgZnJvbSBDLiBTYXZvbmVuIGZvciBBTFNGIENDREwpCmRhdGU6IDIwMjIKLS0tCiAgCiAgKipQdXJwb3NlOioqCiAgCkNhbGN1bGF0ZSBhbmQgcGxvdCBtdXRhdGlvbmFsIHNpZ25hdHVyZXMgZm9yIGFsbCBzYW1wbGVzIHVzaW5nIFtDT1NNSUMgc2lnbmF0dXJlc10oaHR0cHM6Ly9jYW5jZXIuc2FuZ2VyLmFjLnVrL2Nvc21pYykgYW5kIApbQWxleGFuZHJvdiBldCBhbCwgMjAxM10oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wdWJtZWQvMjM5NDU1OTIpIG11dGF0aW9uYWwgc2lnbmF0dXJlcy4gCgojIyMjIFVzYWdlCgpUbyBydW4gdGhpcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHVzZToKICBgYGAKUnNjcmlwdCAtZSAicm1hcmtkb3duOjpyZW5kZXIoJ2FuYWx5c2VzL211dGF0aW9uYWwtc2lnbmF0dXJlcy8wMS1rbm93bl9zaWduYXR1cmVzLlJtZCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbiA9IFRSVUUpIgpgYGAKCl9UaGlzIGFzc3VtZXMgeW91IGFyZSBpbiB0aGUgdG9wIGRpcmVjdG9yeSBvZiB0aGUgcmVwb3NpdG9yeS5fCgojIyBTZXR1cAoKIyMjIyBQYWNrYWdlcyBhbmQgZnVuY3Rpb25zCgpJbXBvcnQgbmVjZXNzYXJ5IGZ1bmN0aW9ucy4KCmBgYHtyIGxvYWQgbGlicmFyaWVzfQojIE1hZ3JpdHRyIHBpcGUKYCU+JWAgPC0gZHBseXI6OmAlPiVgCgojIEltcG9ydCBzcGVjaWFsaXplZCBmdW5jdGlvbnMKc291cmNlKGZpbGUucGF0aCgidXRpbCIsICJtdXRfc2lnX2Z1bmN0aW9ucy5SIikpCgojIExvYWQgdGhpcyBsaWJyYXJ5CmxpYnJhcnkoZGVjb25zdHJ1Y3RTaWdzKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgpTZXQgdXAgZGlyZWN0b3J5IHBhdGhzLiAKCmBgYHtyIHNldCBkaXJlY3Rvcmllc30KZGF0YV9kaXIgPC0gZmlsZS5wYXRoKCIuLiIsICIuLiIsICJkYXRhIikKaW5wdXRfZGlyIDwtICJpbnB1dCIKcmVzdWx0c19kaXIgPC0gInJlc3VsdHMiCnBsb3RzX2RpciA8LSAicGxvdHMiCmZpZ3VyZXNfZGlyIDwtIGZpbGUucGF0aCgiLi4iLCAiLi4iLCAiZmlndXJlcyIpCmNvc21pY3YyX3Bsb3RzIDwtIGZpbGUucGF0aChwbG90c19kaXIsICJjb3NtaWN2MiIpCm5hdHVyZV9wbG90cyA8LSBmaWxlLnBhdGgocGxvdHNfZGlyLCAibmF0dXJlIikKY29zbWljdjNfcGxvdHMgPC0gZmlsZS5wYXRoKHBsb3RzX2RpciwgImNvc21pY3YzIikKYGBgCgpNYWtlIG5ldyBkaXJlY3RvcmllcyBmb3IgdGhlIHJlc3VsdHMuIAoKYGBge3IgbWFrZSBkaXJlY3Rvcmllc30KaWYgKCFkaXIuZXhpc3RzKHJlc3VsdHNfZGlyKSkgewogIGRpci5jcmVhdGUocmVzdWx0c19kaXIpCn0KaWYgKCFkaXIuZXhpc3RzKGNvc21pY3YyX3Bsb3RzKSkgewogIGRpci5jcmVhdGUoY29zbWljdjJfcGxvdHMsIHJlY3Vyc2l2ZSA9IFRSVUUpCn0KaWYgKCFkaXIuZXhpc3RzKG5hdHVyZV9wbG90cykpIHsKICBkaXIuY3JlYXRlKG5hdHVyZV9wbG90cywgcmVjdXJzaXZlID0gVFJVRSkKfQppZiAoIWRpci5leGlzdHMoY29zbWljdjNfcGxvdHMpKSB7CiAgZGlyLmNyZWF0ZShjb3NtaWN2M19wbG90cywgcmVjdXJzaXZlID0gVFJVRSkKfQpgYGAKCiMjIFJlYWQgaW4gZGF0YQoKYGBge3J9CiMgRGVjbGFyZSBmaWxlIHBhdGggZm9yIGNvbnNlbnN1cyBmaWxlCmNvbnNlbnN1c19maWxlIDwtIGZpbGUucGF0aChkYXRhX2RpciwgInNudi1jb25zZW5zdXMtcGx1cy1ob3RzcG90cy5tYWYudHN2Lmd6IikKYGBgCgpSZWFkIGluIHRoZSBjb25zZW5zdXMgTUFGIGZpbGUuIAoKYGBge3J9CiMgUmVhZCBpbiB0aGUgZmlsZQptYWYgPC0gZGF0YS50YWJsZTo6ZnJlYWQoY29uc2Vuc3VzX2ZpbGUsIGRhdGEudGFibGUgPSBGQUxTRSkKYGBgCgojIyMgUmVhZCBpbiBjb2xvciBwYWxldHRlcwoKUmVhZCBpbiB0aGUgaGlzdG9sb2d5IGNvbG9ycyBhbmQgbGFiZWxzLiAKCmBgYHtyfQpoaXN0b2xvZ3lfbGFiZWxfbWFwcGluZyA8LSByZWFkcjo6cmVhZF90c3YoCiAgZmlsZS5wYXRoKGZpZ3VyZXNfZGlyLCAicGFsZXR0ZXMiLCAiaGlzdG9sb2d5X2xhYmVsX2NvbG9yX3RhYmxlLnRzdiIpCikgJT4lIAogICMgU2VsZWN0IGp1c3QgdGhlIGNvbHVtbnMgd2Ugd2lsbCBuZWVkIGZvciBwbG90dGluZwogIGRwbHlyOjpzZWxlY3QoS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCwgZGlzcGxheV9ncm91cCwgZGlzcGxheV9vcmRlciwgaGV4X2NvZGVzKSAlPiUgCiAgIyBSZW9yZGVyIGRpc3BsYXlfZ3JvdXAgYmFzZWQgb24gZGlzcGxheV9vcmRlcgogIGRwbHlyOjptdXRhdGUoZGlzcGxheV9ncm91cCA9IGZvcmNhdHM6OmZjdF9yZW9yZGVyKGRpc3BsYXlfZ3JvdXAsIGRpc3BsYXlfb3JkZXIpKQpgYGAKClNldCB1cCBncmFkaWVudCBjb2xvciBwYWxldHRlIGZvciB0aGUgYnViYmxlIG1hdHJpeCBwbG90cy4gCgpgYGB7cn0KZ3JhZGllbnRfY29sX3BhbGV0dGUgPC0gcmVhZHI6OnJlYWRfdHN2KAogIGZpbGUucGF0aChmaWd1cmVzX2RpciwgInBhbGV0dGVzIiwgImdyYWRpZW50X2NvbG9yX3BhbGV0dGUudHN2IikKKQoKIyBXb24ndCBuZWVkIE5BIGNvbG9yIHRoaXMgdGltZS4gCmdyYWRpZW50X2NvbF9wYWxldHRlIDwtIGdyYWRpZW50X2NvbF9wYWxldHRlICU+JQogIGRwbHlyOjpmaWx0ZXIoY29sb3JfbmFtZXMgIT0gIm5hX2NvbG9yIikKYGBgCgpSZWFkIGluIHRoZSBtZXRhZGF0YSBhbmQgc2V0IGl0IHVwIHdpdGggdGhlIGNvbG9yIHBhbGV0dGUuIAoKYGBge3J9Cm1ldGFkYXRhX2RmIDwtIHJlYWRyOjpyZWFkX3RzdihmaWxlLnBhdGgoZGF0YV9kaXIsICJoaXN0b2xvZ2llcy50c3YiKSwgZ3Vlc3NfbWF4ID0gMTAwMDApICU+JSAKICBkcGx5cjo6c2VsZWN0KCJLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEIiwgImV4cGVyaW1lbnRhbF9zdHJhdGVneSIpICU+JQogIGRwbHlyOjppbm5lcl9qb2luKGhpc3RvbG9neV9sYWJlbF9tYXBwaW5nLCBieSA9ICJLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEIikgJT4lIAogIGRwbHlyOjpyZW5hbWUoVHVtb3JfU2FtcGxlX0JhcmNvZGUgPSAiS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCIpIAoKYGBgCgpSZWFkIGluIHRtYi1hbGwgZmlsZSB3aXRoIFdHUyBhbmQgV1hTIHJlZ2lvbiBsZW5ndGhzIHNvIHRoZXkgY2FuIGJlIHVzZWQgZm9yIHRoZSBNYiBkZW5vbWluYXRvci4gCgpgYGB7cn0KIyBTZXQgdXAgQkVEIHJlZ2lvbiBmaWxlIGZvciBUTUIgY2FsY3VsYXRpb25zCnJlZ2lvbl9zaXplcyA8LSByZWFkcjo6cmVhZF90c3YoZmlsZS5wYXRoKGRhdGFfZGlyLCAic252LW11dGF0aW9uLXRtYi1hbGwudHN2IikpICU+JQogIGRwbHlyOjpzZWxlY3QoVHVtb3JfU2FtcGxlX0JhcmNvZGUsIHJlZ2lvbl9zaXplKQpgYGAKCiMjIFNldCB1cCBkYXRhCgpEZXRlcm1pbmUgaG93IG1hbnkgbXV0YXRpb25zIHdlIGhhdmUgcGVyIHNhbXBsZS4KCmBgYHtyfQptdXRfcGVyX3NhbXBsZSA8LSBtYWYgJT4lCiAgZHBseXI6Omdyb3VwX2J5KFR1bW9yX1NhbXBsZV9CYXJjb2RlKSAlPiUKICBkcGx5cjo6dGFsbHkoKSAlPiUKICBkcGx5cjo6YXJyYW5nZShuKQoKc3VtbWFyeShtdXRfcGVyX3NhbXBsZSRuKQpgYGAKCkdyYXBoIHRoaXMuCgpgYGB7cn0KZ2dwbG90Mjo6Z2dwbG90KG11dF9wZXJfc2FtcGxlLCBnZ3Bsb3QyOjphZXMoeCA9IG4sIGdlb20gPSAiZGVuc2l0eSIpKSArCiAgZ2dwbG90Mjo6Z2VvbV9kZW5zaXR5KCkgKwogIGdncGxvdDI6OnRoZW1lX2NsYXNzaWMoKQpgYGAKCk1ha2UgbXV0YXRpb24gZGF0YSBpbnRvIGBkZWNvbnN0cnVjdFNpZ3NgIGlucHV0IGZvcm1hdC4KCmBgYHtyfQojIENvbnZlcnQgdG8gZGVjb25zdHJ1Y3RTaWdzIGlucHV0CnNpZ3NfaW5wdXQgPC0gbXV0LnRvLnNpZ3MuaW5wdXQoCiAgbXV0LnJlZiA9IG1hZiwKICBzYW1wbGUuaWQgPSAiVHVtb3JfU2FtcGxlX0JhcmNvZGUiLAogIGNociA9ICJDaHJvbW9zb21lIiwKICBwb3MgPSAiU3RhcnRfUG9zaXRpb24iLAogIHJlZiA9ICJSZWZlcmVuY2VfQWxsZWxlIiwKICBhbHQgPSAiQWxsZWxlIiwKICBic2cgPSBCU2dlbm9tZS5Ic2FwaWVucy5VQ1NDLmhnMzg6OkJTZ2Vub21lLkhzYXBpZW5zLlVDU0MuaGczOAopCmBgYAoKQWRkIHRvdGFsIG11dGF0aW9ucyBwZXIgc2FtcGxlLiAKCmBgYHtyfQojIENvdW50IHRoZSB0b3RhbCBudW1iZXIgb2Ygc2lnbmF0dXJlIG11dGF0aW9ucyBmb3IgZWFjaCBzYW1wbGUKdG90YWxfbXV0cyA8LSBhcHBseShzaWdzX2lucHV0LCAxLCBzdW0pCmBgYAoKIyMgRGV0ZXJtaW5lIFNpZ25hdHVyZXMgZm9yIENPU01JQyBhbmQgQWxleGFuZHJvdiBldCBhbCwgMjAxMwoKR2V0IGxpc3Qgb2YgdHVtb3Igc2FtcGxlIGlkcy4gCgpgYGB7cn0KdHVtb3Jfc2FtcGxlX2lkcyA8LSBtYWYgJT4lCiAgZHBseXI6OmZpbHRlcihUdW1vcl9TYW1wbGVfQmFyY29kZSAlaW4lIHJvd25hbWVzKHNpZ3NfaW5wdXQpKSAlPiUKICBkcGx5cjo6ZGlzdGluY3QoVHVtb3JfU2FtcGxlX0JhcmNvZGUpICU+JQogIGRwbHlyOjpwdWxsKFR1bW9yX1NhbXBsZV9CYXJjb2RlKQpgYGAKCkdldCBbQ09TTUlDIHYyIHNpZ25hdHVyZXNdKGh0dHBzOi8vY2FuY2VyLnNhbmdlci5hYy51ay9jb3NtaWMpIGZvciBlYWNoIHNhbXBsZS4gClRoaXMgc3RlcCB3aWxsIHRha2Ugc29tZSB0aW1lLiAKCmBgYHtyfQpzYW1wbGVfc2lnc19jb3NtaWMgPC0gbGFwcGx5KHR1bW9yX3NhbXBsZV9pZHMsIGZ1bmN0aW9uKHNhbXBsZV9pZCkgewogICMgRGV0ZXJtaW5lIHRoZSBzaWduYXR1cmVzIGNvbnRyaWJ1dGluZyB0byB0aGUgc2FtcGxlCiAgd2hpY2hTaWduYXR1cmVzKAogICAgdHVtb3IucmVmID0gc2lnc19pbnB1dCwKICAgIHNpZ25hdHVyZXMucmVmID0gc2lnbmF0dXJlcy5jb3NtaWMsCiAgICBzYW1wbGUuaWQgPSBzYW1wbGVfaWQsCiAgICBjb250ZXh0cy5uZWVkZWQgPSBUUlVFCiAgKQp9KQojIEJyaW5nIGFsb25nIHRoZSBuYW1lcwpuYW1lcyhzYW1wbGVfc2lnc19jb3NtaWMpIDwtIHR1bW9yX3NhbXBsZV9pZHMKCiMgQ3JlYXRlIG1hdHJpeCBvZiBDT1NNSUMgc2lnbmF0dXJlIHdlaWdodHMKY29zbWljX3dlaWdodHMgPC0gbGFwcGx5KHNhbXBsZV9zaWdzX2Nvc21pYywgIltbIiwgIndlaWdodHMiKQpjb3NtaWNfd2lkZSA8LSBkby5jYWxsKGRwbHlyOjpiaW5kX3Jvd3MsIGNvc21pY193ZWlnaHRzKSAlPiUKICBhZGRfY29sdW1uKCdLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEJyA9IHVubGlzdChsYXBwbHkoY29zbWljX3dlaWdodHMsIHJvd25hbWVzKSksIC5iZWZvcmUgPSAxKSAlPiUKICB0aWJibGU6OmFzX3RpYmJsZSgpICU+JQpyZWFkcjo6d3JpdGVfdHN2KGZpbGUucGF0aChyZXN1bHRzX2RpciwgJ0NPU01JQ3YyX3NpZ25hdHVyZV9leHBvc3VyZXMudHN2JykpCmBgYAoKR2V0IFtBbGV4YW5kcm92IGV0IGFsLCAyMDEzXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3B1Ym1lZC8yMzk0NTU5Mikgc2lnbmF0dXJlcyBmb3IgZWFjaCBzYW1wbGUuIAoKYGBge3J9CnNhbXBsZV9zaWdzX25hdHVyZSA8LSBsYXBwbHkodHVtb3Jfc2FtcGxlX2lkcywgZnVuY3Rpb24oc2FtcGxlX2lkKSB7CiAgIyBEZXRlcm1pbmUgdGhlIHNpZ25hdHVyZXMgY29udHJpYnV0aW5nIHRvIHRoZSBzYW1wbGUKICB3aGljaFNpZ25hdHVyZXMoCiAgICB0dW1vci5yZWYgPSBzaWdzX2lucHV0LAogICAgc2lnbmF0dXJlcy5yZWYgPSBzaWduYXR1cmVzLm5hdHVyZTIwMTMsCiAgICBzYW1wbGUuaWQgPSBzYW1wbGVfaWQsCiAgICBjb250ZXh0cy5uZWVkZWQgPSBUUlVFCiAgKQp9KQojIEJyaW5nIGFsb25nIHRoZSBuYW1lcwpuYW1lcyhzYW1wbGVfc2lnc19uYXR1cmUpIDwtIHR1bW9yX3NhbXBsZV9pZHMKCiMgQ3JlYXRlIGRhdGEgZnJhbWUgb2YgTmF0dXJlIHNpZ25hdHVyZSB3ZWlnaHRzCm5hdHVyZV93ZWlnaHRzIDwtIGxhcHBseShzYW1wbGVfc2lnc19uYXR1cmUsICJbWyIsICJ3ZWlnaHRzIikKbmF0dXJlX3dpZGUgPC0gZG8uY2FsbChkcGx5cjo6YmluZF9yb3dzLCBuYXR1cmVfd2VpZ2h0cykgJT4lCiAgYWRkX2NvbHVtbignS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCcgPSB1bmxpc3QobGFwcGx5KG5hdHVyZV93ZWlnaHRzLCByb3duYW1lcykpLCAuYmVmb3JlID0gMSkgJT4lCiAgdGliYmxlOjphc190aWJibGUoKSAlPiUKcmVhZHI6OndyaXRlX3RzdihmaWxlLnBhdGgocmVzdWx0c19kaXIsICdOYXR1cmVfc2lnbmF0dXJlX2V4cG9zdXJlcy50c3YnKSkKYGBgCgpHZXQgW0NPU01JQyBnZW5vbWUgdjMuMyBzaWduYXR1cmVzXShodHRwczovL2NhbmNlci5zYW5nZXIuYWMudWsvY29zbWljKSBmb3IgZWFjaCBzYW1wbGUuIApUaGlzIHN0ZXAgd2lsbCB0YWtlIHNvbWUgdGltZS4gCgpgYGB7cn0Kc2lnbmF0dXJlcy5jb3NtaWMudjMuMyA8LSByZWFkX3RzdihmaWxlLnBhdGgoaW5wdXRfZGlyLCAnQ09TTUlDX3YzLjMuMV9TQlNfR1JDaDM4LnR4dCcpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoJ1R5cGUnKSAlPiUKICB0ICU+JQogIGFzLmRhdGEuZnJhbWUoKQoKc2FtcGxlX3NpZ3NfY29zbWljX3YzMyA8LSBsYXBwbHkodHVtb3Jfc2FtcGxlX2lkcywgZnVuY3Rpb24oc2FtcGxlX2lkKSB7CiAgIyBEZXRlcm1pbmUgdGhlIHNpZ25hdHVyZXMgY29udHJpYnV0aW5nIHRvIHRoZSBzYW1wbGUKICB3aGljaFNpZ25hdHVyZXMoCiAgICB0dW1vci5yZWYgPSBzaWdzX2lucHV0LAogICAgc2lnbmF0dXJlcy5yZWYgPSBzaWduYXR1cmVzLmNvc21pYy52My4zLAogICAgc2FtcGxlLmlkID0gc2FtcGxlX2lkLAogICAgY29udGV4dHMubmVlZGVkID0gVFJVRQogICkKfSkKIyBCcmluZyBhbG9uZyB0aGUgbmFtZXMKbmFtZXMoc2FtcGxlX3NpZ3NfY29zbWljX3YzMykgPC0gdHVtb3Jfc2FtcGxlX2lkcwojIAojIENyZWF0ZSBtYXRyaXggb2YgQ09TTUlDIHNpZ25hdHVyZSB3ZWlnaHRzCmNvc21pY192MzNfd2VpZ2h0cyA8LSBsYXBwbHkoc2FtcGxlX3NpZ3NfY29zbWljX3YzMywgIltbIiwgIndlaWdodHMiKQpjb3NtaWNfdjMzX3dpZGUgPC0gZG8uY2FsbChkcGx5cjo6YmluZF9yb3dzLCBjb3NtaWNfdjMzX3dlaWdodHMpICU+JQogIGFkZF9jb2x1bW4oJ0tpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQnID0gdW5saXN0KGxhcHBseShjb3NtaWNfdjMzX3dlaWdodHMsIHJvd25hbWVzKSksIC5iZWZvcmUgPSAxKSAlPiUKICB0aWJibGU6OmFzX3RpYmJsZSgpICU+JQogIHJlYWRyOjp3cml0ZV90c3YoZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCAnQ09TTUlDdjMuM19zaWduYXR1cmVfZXhwb3N1cmVzLnRzdicpKQpgYGAKCiMjIyBDYWxjdWxhdGUgdGhlIG11dGF0aW9ucyBwZXIgTWIgZm9yIGVhY2ggc2lnbmF0dXJlCgpEbyB0aGlzIGZvciBDT1NNSUMgdjIgbXV0YXRpb24gc2lnbmF0dXJlcy4KCmBgYHtyfQojIENhbGN1bGF0ZSBtdXRhdGlvbnMgcGVyIHNpZ25hdHVyZQpjb3NtaWNfc2lnc19kZiA8LSBjYWxjX211dF9wZXJfc2lnKAogIHNhbXBsZV9zaWdzX2Nvc21pYywKICBtdXRzX3Blcl9zYW1wbGUgPSB0b3RhbF9tdXRzLAogIHJlZ2lvbl9zaXplID0gcmVnaW9uX3NpemVzLAogIG1ldGFkYXRhID0gbWV0YWRhdGFfZGYKKSAKCiMgV3JpdGUgdGhpcyB0byBhIGZpbGUgYnV0IGRyb3AgdGhlIGNvbG9yIGNvbHVtbgpjb3NtaWNfc2lnc19kZiAlPiUgCiAgZHBseXI6OnNlbGVjdCgtaGV4X2NvZGVzKSAlPiUgCiAgcmVhZHI6OndyaXRlX3RzdihmaWxlLnBhdGgocmVzdWx0c19kaXIsICJjb3NtaWN2Ml9zaWduYXR1cmVzX3Jlc3VsdHMudHN2IikpCgojIFByaW50IG91dCBhIHByZXZpZXcKY29zbWljX3NpZ3NfZGYKYGBgCgpEbyB0aGlzIGZvciBDT1NNSUMgdjMuMyBtdXRhdGlvbiBzaWduYXR1cmVzLgoKYGBge3J9CiMgQ2FsY3VsYXRlIG11dGF0aW9ucyBwZXIgc2lnbmF0dXJlCmNvc21pY3YzX3NpZ3NfZGYgPC0gY2FsY19tdXRfcGVyX3NpZygKICBzYW1wbGVfc2lnc19jb3NtaWNfdjMzLAogIG11dHNfcGVyX3NhbXBsZSA9IHRvdGFsX211dHMsCiAgcmVnaW9uX3NpemUgPSByZWdpb25fc2l6ZXMsCiAgbWV0YWRhdGEgPSBtZXRhZGF0YV9kZgopIAoKIyBXcml0ZSB0aGlzIHRvIGEgZmlsZSBidXQgZHJvcCB0aGUgY29sb3IgY29sdW1uCmNvc21pY3YzX3NpZ3NfZGYgJT4lIAogIGRwbHlyOjpzZWxlY3QoLWhleF9jb2RlcykgJT4lIAogIHJlYWRyOjp3cml0ZV90c3YoZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCAiY29zbWljdjMuM19zaWduYXR1cmVzX3Jlc3VsdHMudHN2IikpCgojIFByaW50IG91dCBhIHByZXZpZXcKY29zbWljdjNfc2lnc19kZgpgYGAKCkRvIHRoaXMgZm9yIEFsZXhhbmRyb3YgZXQgYWwsIDIwMTMgbXV0YXRpb24gc2lnbmF0dXJlcy4KCmBgYHtyfQojQ2FsY3VsYXRlIG11dGF0aW9ucyBwZXIgc2lnbmF0dXJlCm5hdHVyZV9zaWdzX2RmIDwtIGNhbGNfbXV0X3Blcl9zaWcoCiAgc2FtcGxlX3NpZ3NfbmF0dXJlLAogIG11dHNfcGVyX3NhbXBsZSA9IHRvdGFsX211dHMsCiAgcmVnaW9uX3NpemUgPSByZWdpb25fc2l6ZXMsCiAgbWV0YWRhdGEgPSBtZXRhZGF0YV9kZgopIAoKIyBXcml0ZSB0aGlzIHRvIGEgZmlsZSBidXQgZHJvcCB0aGUgY29sb3IgY29sdW1uCm5hdHVyZV9zaWdzX2RmICU+JSAKICBkcGx5cjo6c2VsZWN0KC1oZXhfY29kZXMpICU+JSAKICByZWFkcjo6d3JpdGVfdHN2KGZpbGUucGF0aChyZXN1bHRzX2RpciwgIm5hdHVyZV9zaWduYXR1cmVzX3Jlc3VsdHMudHN2IikpCgojIFByaW50IG91dCBhIHByZXZpZXcKbmF0dXJlX3NpZ3NfZGYKYGBgCgojIyBNdXRhdGlvbiBzaWduYXR1cmUgYnViYmxlIG1hdHJpeCBieSBoaXN0b2xvZ3kgZ3JvdXBzCgpGb3IgQ09TTUlDIHYyIHNpZ25hdHVyZXMKCmBgYHtyfQpidWJibGVfbWF0cml4X3Bsb3QoY29zbWljX3NpZ3NfZGYsIAogICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiQ09TTUlDIFNpZ25hdHVyZXMiLCAKICAgICAgICAgICAgICAgICAgIGNvbG9yX3BhbGV0dGUgPSBncmFkaWVudF9jb2xfcGFsZXR0ZSRoZXhfY29kZXMKKQpgYGAKCmBgYHtyfQpnZ3Bsb3QyOjpnZ3NhdmUoCiAgZmlsZS5wYXRoKGNvc21pY3YyX3Bsb3RzLCAiYnViYmxlX21hdHJpeF9jb3NtaWN2Ml9tdXRhdGlvbl9zaWcucG5nIiksCiAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzID0gImNtIikKYGBgCgoKRm9yIE5hdHVyZSBzaWduYXR1cmVzCgpgYGB7cn0KYnViYmxlX21hdHJpeF9wbG90KG5hdHVyZV9zaWdzX2RmLCAKICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIkFsZXhhbmRyb3YgZXQgYWwsIDIwMTMgc2lnbmF0dXJlcyIsIAogICAgICAgICAgICAgICAgICAgY29sb3JfcGFsZXR0ZSA9IGdyYWRpZW50X2NvbF9wYWxldHRlJGhleF9jb2RlcykKYGBgCgpgYGB7cn0KZ2dwbG90Mjo6Z2dzYXZlKAogIGZpbGUucGF0aChuYXR1cmVfcGxvdHMsICJidWJibGVfbWF0cml4X25hdHVyZV9tdXRhdGlvbl9zaWcucG5nIiksIAogIHdpZHRoID0gMzAsIGhlaWdodCA9IDIwLCB1bml0cyA9ICJjbSIpCmBgYAoKCkZvciBDT1NNSUMgdjMuMyBzaWduYXR1cmVzCgpgYGB7cn0KYnViYmxlX21hdHJpeF9wbG90KGNvc21pY3YzX3NpZ3NfZGYsIAogICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiQ09TTUlDIFNpZ25hdHVyZXMiLCAKICAgICAgICAgICAgICAgICAgIGNvbG9yX3BhbGV0dGUgPSBncmFkaWVudF9jb2xfcGFsZXR0ZSRoZXhfY29kZXMKKQpgYGAKCmBgYHtyfQpnZ3Bsb3QyOjpnZ3NhdmUoCiAgZmlsZS5wYXRoKGNvc21pY3YzX3Bsb3RzLCAiYnViYmxlX21hdHJpeF9jb3NtaWN2M19tdXRhdGlvbl9zaWcucG5nIiksCiAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzID0gImNtIikKYGBgCgojIyBNdXRhdGlvbiBzaWduYXR1cmUgZ3JvdXBlZCBiYXIgcGxvdHMgZm9yIGVhY2ggaGlzdG9sb2d5IGdyb3VwCgpXZSB3aWxsIG1ha2UgdGhlc2UgcGxvdHMgZm9yIHByaW1hcnkgdHVtb3Igc2FtcGxlcyBvbmx5LiAKTGV0cyBtYWtlIHRoZXNlIGZvciBDT1NNSUMgbXV0YXRpb24gc2lnbmF0dXJlcyBmaXJzdC4gCgpgYGB7ciwgcmVzdWx0cyA9ICJoaWRlIn0KIyBNYWtlIGdyb3VwZWQgYmFyIHBsb3RzCmxhcHBseSh1bmlxdWUoY29zbWljX3NpZ3NfZGYkZGlzcGxheV9ncm91cCksCiAgZ3JvdXBlZF9zaWdfYmFycGxvdCwKICBzaWdfbnVtX2RmID0gY29zbWljX3NpZ3NfZGYsCiAgb3V0cHV0X2RpciA9IGZpbGUucGF0aChjb3NtaWN2Ml9wbG90cywgInNpZ25hdHVyZV9ncm91cGVkX2JhcnBsb3RzIiksIAogIGxhYmVsID0gImNvc21pY192MiIKKQpgYGAKCk1ha2UgdGhlc2UgcGxvdHMgZm9yIEFsZXhhbmRyb3YgZXQgYWwsIDIwMTMgc2lnbmF0dXJlcy4gCgpgYGB7ciwgcmVzdWx0cyA9ICJoaWRlIn0KIyBNYWtlIGdyb3VwZWQgYmFyIHBsb3RzCmxhcHBseSh1bmlxdWUobmF0dXJlX3NpZ3NfZGYkZGlzcGxheV9ncm91cCksCiAgZ3JvdXBlZF9zaWdfYmFycGxvdCwKICBzaWdfbnVtX2RmID0gbmF0dXJlX3NpZ3NfZGYsCiAgb3V0cHV0X2RpciA9IGZpbGUucGF0aChuYXR1cmVfcGxvdHMsICJzaWduYXR1cmVfZ3JvdXBlZF9iYXJwbG90cyIpLAogIGxhYmVsID0gIm5hdHVyZSIKKQpgYGAKCgpNYWtlIHRoZXNlIHBsb3RzIGZvciBDT1NNSUMgdjMuMyBzaWduYXR1cmVzLiAKCmBgYHtyLCByZXN1bHRzID0gImhpZGUifQojIE1ha2UgZ3JvdXBlZCBiYXIgcGxvdHMKbGFwcGx5KHVuaXF1ZShjb3NtaWN2M19zaWdzX2RmJGRpc3BsYXlfZ3JvdXApLAogIGdyb3VwZWRfc2lnX2JhcnBsb3QsCiAgc2lnX251bV9kZiA9IGNvc21pY3YzX3NpZ3NfZGYsCiAgb3V0cHV0X2RpciA9IGZpbGUucGF0aChjb3NtaWN2M19wbG90cywgInNpZ25hdHVyZV9ncm91cGVkX2JhcnBsb3RzIiksCiAgbGFiZWwgPSAiY29zbWljX3YzLjMiCikKYGBgCgoKCiMjIFNlc3Npb24gSW5mbwoKYGBge3J9CnNlc3Npb25JbmZvKCkKYGBgCg==